package com.xxx.blog.service.impl;

import com.github.pagehelper.PageHelper;
import com.xxx.blog.domain.ArticleType;
import com.xxx.blog.mapper.ArticleTypeMapper;
import com.xxx.blog.query.ArticleTypeQuery;
import com.xxx.blog.service.IArticleTypeService;
import com.xxx.blog.vo.ArticleTypeVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service//
public class ArticleTypeServiceImpl implements IArticleTypeService {
    @Autowired
    private ArticleTypeMapper articleTypeMapper;

    @Override
    public List<ArticleType> findAll() {
        return articleTypeMapper.findAll();
    }

    @Override
    public ArticleType findOne(Long id) {
        return articleTypeMapper.findOne(id);
    }

    @Override
    public List<ArticleType> queryPage(ArticleTypeQuery articleTypeQuery) {
        PageHelper.startPage(articleTypeQuery.getCurrentPage(), articleTypeQuery.getPageSize());

        return articleTypeMapper.queryPage(articleTypeQuery);
    }

    @Override
    public void addArticleType(ArticleType articleType) {
        ////加密业务
        //String salt = RandomUtil.randomString(32);
        //articleType.setSalt(salt);//盐水保存到数据库是为了后面做对比
        //
        //articleType.setPassword(SecureUtil.md5(articleType.getPassword()+salt));//核心代码,其他缺啥补啥,加盐加密

        articleTypeMapper.addArticleType(articleType);
    }

    @Override
    public void updateArticleType(ArticleType articleType) {
        articleType.setUpdateTime(new Date());//解决更新时间bug
        articleTypeMapper.updateArticleType(articleType);
    }

    //alt shif p
    @Override
    public void deleteArticleType(Long id) {
        articleTypeMapper.deleteArticleType(id);
    }

    @Override
    public void batchArticleTypes(Long[] ids) {
        articleTypeMapper.batchArticleTypes(ids);
    }

    @Override
    public List<ArticleType> getTypeTree(Long id) {
        // 定义返回的所有父类型集合
        List<ArticleType> typeTree = new ArrayList<>();
        // 所有类型
        List<ArticleType> all = articleTypeMapper.findAll();
        // 将所有类型放入map集合，方便通过子类型的parentId获取父类型
        // key为id，value为类型对象(行数据)
        Map<Long, ArticleType> typeMap = new HashMap<>();
        for (ArticleType articleType : all) {
            typeMap.put(articleType.getId(), articleType);
        }

        for (ArticleType articleType : all) {
            // 自己不能选择自己
            if (id.equals(articleType.getId())) {
                continue;
            }

            // 判断父类型id是否为空
            if (articleType.getParentId() == null) {
                // 父类型id为空则为父类型,将父类型放入父类型集合
                typeTree.add(articleType);
            } else {
                // 否则为子类型
                // 通过子类型的父类型id从map集合拿到父类型
                ArticleType parent = typeMap.get(articleType.getParentId());
                // 防空判断
                if (parent != null) {
                    // 拿到父类型添加子类型
                    parent.getChildren().add(articleType);
                }
            }
        }

        return typeTree;
    }

    @Override
    public List<ArticleTypeVo> getArticleTypeStatistics() {
        return articleTypeMapper.getArticleTypeStatistics();
    }
}
